AWS Amplify iOSでCoreMLフレームワークと統合された画像のテキスト解析を試してみた #reinvent
Amplify iOSではCoreMLフレームワークをサポート!
re:Invent 2019の期間中、ネイティブアプリ用の新しいSDKAmplify iOSとAmplify Androidがプレビューにて公開されました。
【速報】モバイル向けの新しいSDK「Amplify iOS & Amplify Android」が公開されました! #reinvent
その中で、iOSでは Prediction(予測機能) について CoreMLフレームワークとの組み合わせ が実装されています。ML/AI系の機能を、AWSサービスとiOS Frameworkを組み合わせ、非常に高い精度の結果セットが得られるようになっています。
CoreMLフレームワークおよびCoreML VisionフレームワークはiOSの機械学習用のフレームワークで、学習モデルなどを扱う際に開発者が専門的な知識を必要とせずに扱えるように補助するフレームワークです。CPU、GPU、ニューラルエンジンを活用し、予測の作成、モデルのトレーニングや微調整をすべてユーザーのデバイス上で行うようになっています。
特にユーザーに合わせた画像認識機能などを実装する際に役立ちそうな機能アップデートです。オンラインでもオフラインでも精度の高い予測処理を、ワンコードで実装できるところがかなりメリットがありますね。
ということで本記事では、Amplify iOSを使って画像のテキスト解析を試してみました。
Amplify iOSでできること
以下はオンライン/オフラインのどちらでも使うことができるようになりました。
- 画像テキスト解析
- エンティティの認識
- 実世界のオブジェクトへのラベル付け
- テキストの解釈
以下はオンラインのみ対応しています。
- ある言語から別の言語へのテキストの翻訳
- テキストから音声への変換
- 自動トレーニング用の画像のアップロード
- 文字起こし
インストール
それではまずはインストールしていきます。なお、AmplifyのiOSアプリ向けプロジェクトはすでに作成済みの前提で進めます。また、今回は対話形式でのインストールが必要なためAmplify CLIを利用します。
まずは predictions
というプラグインを追加します。
$ amplify add predictions
対話形式で、どのような機能を作りたいか問われます。
? Please select from one of the categories below : Identify ? What would you like to identify? : Identify Text ? Provide a friendly name for your resource : identifyTexte454f02b ? Would you also like to identify documents? : Yes ? Who should have access? : Auth and Guest users
以下のように分類されているので、自分の作りたい機能に合わせて設定します。本記事では Identify Text
を選択しています。
また、最後の Who should have access?
は Auth and Guest users
を選び、Cognito User Poolsの作成を行うようにします。これはAWSリソースへのアクセスを行うため必須になります。
Successfully added resource identifyTexte454f02b locally
ローカルでの設定が完了したので amplify push
でAWSリソースを作成します。
$ amplify push | Category | Resource name | Operation | Provider plugin | | ----------- | --------------------- | --------- | ----------------- | | Predictions | identifyTexte454f02b | Create | awscloudformation | | Api | amplifyDatasource | No Change | awscloudformation | | Auth | amplifysample93d65ae8 | No Change | awscloudformation |
以上でAWSリソースの作成は完了です。
次に AWSPredictionsPlugin
というPodを追加します。Podfile
全体としては以下のようになります。
target 'AmplifySample' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for AmplifySample pod 'amplify-tools' pod 'Amplify' pod 'AWSPluginsCore' pod 'AWSPredictionsPlugin' pod 'AWSMobileClient', '~> 2.12.0' pod 'AmplifyPlugins/AWSAPIPlugin' end
最後に pod install
を実行して終わりです。
$ pod install --repo-update
実装
今回は画像のテキスト解析を行いたいだけなので、iOSアプリでは画面なしで実装します。
まずは AppDelegate
でセットアップする処理を書きます。
import UIKit import Amplify import AWSPredictionsPlugin import AmplifyPlugins @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let apiPlugin = AWSAPIPlugin(modelRegistration: AmplifyModels()) let predictionsPlugin = AWSPredictionsPlugin() do { try Amplify.add(plugin: apiPlugin) try Amplify.add(plugin: predictionsPlugin) try Amplify.configure() print("Amplify initialized") } catch { print("Failed to configure Amplify \(error)") } return true } }
次に ViewController
で画像のテキスト解析を行う処理を実装します。雑ですが viewDidLoad()
に実装します。
import UIKit import Amplify class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() predict() } func predict() { guard let path = Bundle.main.path(forResource: "sample-image-christmas", ofType: "jpg") else { return } let image = URL(fileURLWithPath: path) let options = PredictionsIdentifyRequest.Options(defaultNetworkPolicy: .offline, uploadToRemote: false) _ = Amplify.Predictions.identify(type: .detectText(.plain), image: image, options: options, listener: { (event) in switch event { case .completed(let result): let data = result as! IdentifyTextResult if let lines = data.rawLineText { for line in lines { print(line) } } case .failed(let error): print(error) default: print("") } }) } }
対象の画像は URL
で指定します。ローカルまたはWeb上の画像から指定します。
上記は sample-image-christmas.jpg
という画像ファイルをXcodeプロジェクト内に追加した場合のコードです。オフラインでの動作を試したい場合はXcodeプロジェクトに追加するようにしてください。
試してみる
以下の画像を用意しました。素敵な写真はPexelsのYlanite Koppensさんからいただきました。御礼申し上げます。
実行するとコンソールに以下のような結果が表示されます。正しく解析できていますね!
なお、オフラインで実行した場合も同様の結果が得られます。ぜひ、実際に試してみてください。
iOSのフレームワークと統合されたAmplify
CoreML Vision FrameworkとAWSのML/AI系サービスの統合によって、かなりパワフルに働くようになりました。
モバイルアプリの場合は常に安定した通信環境が得られるとは限りませんので、本記事でご紹介したような機能を使うアプリの場合は非常に有効な手段だと思います。
Predictionsに含まれる機能は他にもあるので、試していきたいと思います。